home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / lpc10 / lpc10.c < prev    next >
C/C++ Source or Header  |  2000-05-18  |  4KB  |  171 lines

  1. /***********************************************************************
  2. *
  3. *     NSA LPC-10 Voice Coder
  4. *
  5. *     Unix C Version 
  6. *
  7. *     5 November 1990
  8. *
  9. *     Modified for use within Speak Freely by John Walker
  10. *
  11. *************************************************************************/
  12.  
  13. #include "lpcdefs.h"
  14. #include "config.ch"
  15. #include "common.h"
  16.  
  17. #include "../ulaw2linear.h"
  18.  
  19. #define BUFSIZE 600
  20.  
  21. int count=0;
  22.  
  23. int tau[LTAU] = {
  24.     20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,
  25.     35,36,37,38,39,40,42,44,46,48,50,52,54,56,58,60,62,64,66,
  26.     68,70,72,74,76,78,80,84,88,92,96,100,104,108,112,116,120,
  27.     124,128,132,136,140,144,148,152,156
  28. };
  29.  
  30. int nframe, nfb, nbits, nunsfm, iclip, maxosp, NFBLK;
  31.  
  32. /* analys */
  33. float *inbuf, *pebuf, *lpbuf, *ivbuf;
  34. float lparray[LBUFH-LBUFL+1], ivarray[PWINH-PWINL+1];
  35. float pearray[SBUFH-SBUFL+1], inarray[SBUFH-SBUFL+1];
  36. int vwin[2][AF], awin[2][AF], voibuf[2][AF+1];
  37. float rmsbuf[AF], psi[MAXORD], rcbuf[MAXORD][AF];
  38. float amdf[LTAU];
  39. float phi[MAXORD][MAXORD];
  40.  
  41. /* bsynz.c */
  42. float exc[MAXPIT+MAXORD], exc2[MAXPIT+MAXORD];
  43. float noise[MAXPIT+MAXORD];
  44.  
  45. /* decode.c */
  46. int drc[3][MAXORD], dpit[3], drms[3];
  47.  
  48. /* dyptrk */
  49. float s[60];
  50. int p[60][2];
  51.  
  52. /* onset */
  53. float l2buf[16];
  54.  
  55. /* synths.c */
  56. int ipiti[11], ivuv[11];
  57. float rci[MAXORD][11], rmsi[11], pc[MAXORD];
  58.  
  59. static void buf_man(inbuffer, outbuffer, len)
  60. float outbuffer[], inbuffer[];
  61. int len;
  62. {
  63.     static float big_buffer[BUFSIZE];
  64.     static int sptr=0, eptr=360, first=1;
  65.     int i;
  66.     
  67.     /* Initialize pseudo-circular buffer */
  68.     if(first)    {
  69.         first = 0;
  70.         for(i=0;i<360;i++)
  71.           big_buffer[i] = 0.0;
  72.     }
  73.     
  74.     /* write new data to end of buffer */
  75.     for(i=0;i<len;i++)    {
  76.         big_buffer[eptr++] = inbuffer[i];
  77.         if (eptr == BUFSIZE) eptr = 0;
  78.         /*eptr = (eptr+1) % BUFSIZE;*/
  79.     }
  80.     
  81.     /* send next 180 samples */
  82.     for(i=0;i<LFRAME;i++)    {
  83.         outbuffer[i] = big_buffer[sptr++];
  84.         if(sptr == BUFSIZE) sptr = 0;
  85.         /*sptr = (sptr+1)%BUFSIZE;*/
  86.     }
  87. }
  88.  
  89. /*  LPC10INIT  --  Initialise for LPC decoding.  */
  90.  
  91. void lpc10init()
  92. {
  93.   initialize1();
  94.   initialize2();
  95. }
  96.  
  97.  
  98. /*  LPC10ENCODE  --  Encode a set of samples with LPC-10.  */
  99.  
  100. int lpc10encode(in, out, inlen)
  101.   unsigned char *in, *out;
  102.   int inlen;
  103. {
  104.     int i, n, o = 0;
  105.     static int pitch;
  106.     static float rms, rc[MAXORD];
  107.     static int voice[2];
  108.     static int j, ipitv, irms, irc[MAXORD], ibits[MAXNB];
  109.     static float speech[MAXFRM + MAXPIT];
  110.  
  111.     i = inlen % LFRAME;
  112.  
  113.     if (i != 0) {
  114.     i = LFRAME - i;
  115.     while (i-- > 0) {
  116.         in[inlen++] = audio_s2u(0);
  117.     }
  118.     }
  119.  
  120.     for (n = 0; n < inlen / LFRAME; n++) {
  121.     for (i = 0; i < LFRAME; i++) {
  122.         speech[i] = ((float) audio_u2s(in[i])) / 32768.0;
  123.     }
  124.     hp100(speech);
  125.     analys(speech, voice, &pitch, &rms, rc-1);
  126.  
  127.     memset(ibits, 0, MAXNB * sizeof(int));
  128.     memset(out, 0, 7);
  129.  
  130.     encode(voice - 1, &pitch, &rms, rc-1, &ipitv, &irms, irc-1);
  131.     channel(0, &ipitv, &irms, irc-1, ibits-1);
  132.     for (j = 0; j < MAXNB; j++) {
  133.         out[j >> 3] |= (!!ibits[j]) << (j & 7);
  134.     }
  135.     o += 7;
  136.     out += 7;
  137.     in += LFRAME;
  138.     }
  139.     return o;
  140. }
  141.  
  142. /*  LPC10DECODE  --  Decode a set of samples with LPC-10.  */
  143.  
  144. int lpc10decode(in, out, inlen)
  145.   unsigned char *in, *out;
  146.   int inlen;
  147. {
  148.     int i, len, n, o = 0;
  149.     static int pitch;
  150.     static float rms, rc[MAXORD];
  151.     static int voice[2];
  152.     static int j, ipitv, irms, irc[MAXORD], ibits[MAXNB];
  153.     static float speech[MAXFRM + MAXPIT];
  154.  
  155.     for (n = 0; n < inlen / 7; n++) {
  156.     for (j = 0; j < MAXNB; j++) {
  157.         ibits[j] = !!(in[j >> 3] & (1 << (j & 7)));
  158.     }
  159.     in += 7;
  160.     channel(1, &ipitv, &irms, irc-1, ibits-1);
  161.     decode(ipitv, &irms, irc-1, voice - 1, &pitch, &rms, rc-1);
  162.     synths(voice-1, &pitch, &rms, rc-1, speech-1, &len);
  163.     buf_man(speech, speech, len);
  164.     for (i = 0; i < LFRAME; i++) {
  165.         *out++ = audio_s2u((short) mmax(-32768.0, mmin(32768.0 * speech[i], 32767.0)));
  166.     }
  167.     o += LFRAME;
  168.     }
  169.     return o;
  170. }
  171.